
public class Solution {
    public boolean isPalindrome(String s) {
        // 初始化两个指针，分别指向字符串的开始和结束
        int left = 0, right = s.length() - 1;

        while (left < right) {
            // 移动左指针直到它指向一个字母或数字
            while (left < right && !Character.isLetterOrDigit(s.charAt(left))) {
                left++;
            }
            // 移动右指针直到它指向一个字母或数字
            while (left < right && !Character.isLetterOrDigit(s.charAt(right))) {
                right--;
            }
            // 比较两个指针指向的字符是否相等（忽略大小写）
            if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))) {
                return false; // 如果不相等，则不是回文串
            }
            // 移动指针，继续比较下一个字符
            left++;
            right--;
        }
        // 所有字符都匹配，是回文串
        return true;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        String s = "A man, a plan, a canal: Panama";
        boolean result = solution.isPalindrome(s);
        System.out.println(result);
    }
}
